var arr = []
for (let i = 1; i <= 5; i++) {
    function foo(j) {
        arr.push(function () {
            console.log(j);
        })
    }
    foo(i)
}

for (var j = 0; j < arr.length; j++) {
    arr[j]();
}
//输出12345
//这里使用的是闭包方法使得 arr.push(function () {console.log(i)})被包在了foo函数中，使得每一次for循环都要创建一个新的foo执行上下文，
// 内部就是存变量j也就是i，从而成为每一个循环中的function的外部作用域
//当执行arr[j]();时，foo虽然已经执行完毕出栈，但还保留了一个闭包集合，里面装了变量i的值，供arr[j]()使用，从而使得每一个arr[]值都不一样

var arr = []
for (let i = 1; i <= 5; i++) {
    arr.push(function () {
        console.log(i);
    })
}
for (var j = 0; j < arr.length; j++) {
    arr[j]();
}
//输出12345
//这里用的let块级作用域，每次for循环都会在词法作用域中创建一个新的区域存放块级作用域中的内容，也就是i的值，
// 从而成为每一个循环中的function的外部作用域，当执行arr[j]();时，就会去外部作用域中找i，也就是每个块级作用域

var arr = []
for (var i = 1; i <= 5; i++) {
    arr.push(function () {
        console.log(i);
    })
}
for (var j = 0; j < arr.length; j++) {
    arr[j]();
}

//输出66666
//这里var不会生成块级作用域，而会变成全局作用域，从而使得，for循环结束后i=6，所以每次执行arr[j]();时都输出6